package com.baofu.paycore.biz.paycore.handler;

import com.baofu.paycore.biz.engine.result.CommandResult;
import com.baofu.paycore.common.exception.PayCoreBizException;
import com.baofu.paycore.manager.model.PayBaseBO;
import com.baofu.paycore.service.facade.enums.PayCoreErrorCode;
import com.baofu.paycore.service.facade.enums.PayStatusEnums;
import com.google.common.base.Objects;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 基础服务父类
 *
 * User: LZQ Date: 2016/04/21  Version: 1.0
 */
@Slf4j
public abstract class BaseHandler<T extends PayBaseBO,V> extends PayBizHandlerAdapter<T,V>{


    protected T doExecute(T payBaseBO){
        checkBeforeProcess(payBaseBO);
        processOrders(payBaseBO);
        reStore(payBaseBO);
        return payBaseBO;
    }


    /**
     * 激活领域对象
     *
     * @param orderId 订单ID
     * @return        订单对象
     */
    public abstract T activeOrder(String orderId);

    /**
     * 查询订单信息
     *
     * @param payNo   支付单号
     * @return        订单对象
     */
    public abstract T queryOrderByPayNo(String payNo);

    /**
     * 前置检查
     *
     * @param order 订单
     */
    protected abstract void checkBeforeProcess(T order);

    /**
     * 生成指令
     *
     * @param order 单据
     */
    protected abstract void processOrders(T order);

    /**
     * 持久化对象
     *
     * @param order 单据
     */
    protected abstract void reStore(T order);


    /**
     * 指令完成后处理
     *
     * @param order     领域模型
     * @param cmdResult 指令处理结果
     */
    protected abstract void processAfter(T order,Map<String, CommandResult> cmdResult);

    /**
     * 校验是否继续
     *
     * @param isRealRtn 是否真实结果
     * @param status    状态
     * @return          true;false
     */
    protected boolean validateContinue(boolean isRealRtn, String status) {

        return isRealRtn && PayStatusEnums.SUCCESS.getCode().equals(status);
    }

    /**
     * 只推进状态初始化的订单
     *
     * @param status  状态
     */
    protected void preDalInnerFund(String status, String payNo) {
        if (Objects.equal(status, PayStatusEnums.INIT.getCode())) {
            return;
        }
        log.error("订单号：{}状态：{} 不能推进", payNo, status);
        throw new PayCoreBizException(PayCoreErrorCode.ORDER_STATUS_NOT_INIT, "订单状态不为初始,不能推进");
    }


}
